package com.gitee.liuzhi.common.util;

import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author ：zxg
 * @date ：Created in 2021/7/14 16:37
 * @version: V1.0
 * @description： 分割list集合工具类
 */

/**
 * @Author liuzhi
 * @Date 2023/8/29 22:10
 * @Version 1.0
 * @Description 分割list集合工具类
 */
public class SplitListUtil {

    /**
     * 截取 集合中的元素
     *
     * @param collection 要截取的集合
     * @param splitSize  每次截取的大小
     */
    public static <T> List<Collection<T>> splitList(Collection<T> collection, int splitSize) {
        if (CollectionUtils.isEmpty(collection)) {
            return Collections.emptyList();
        }
        if (collection.size() < splitSize) {
            List<Collection<T>> list = new ArrayList<>(1);
            list.add(collection);
            return list;
        }
        int pageSize = collection.size() / splitSize + 1;
        return Stream
                // 生成无限长度的Stream 千万记住使用limit方法，不然会无限打印下去。
                .iterate(0, f -> f + 1)
                // 获取其前N个元素
                .limit(pageSize)
                // 开启并行处理
                .parallel()
                // 对于Stream中包含的元素使用给定的转换函数进行转换操作 skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream
                .map(a ->
                        collection.parallelStream().skip((long) a * splitSize).limit(splitSize).collect(Collectors.toList())
                )
                // 过滤空的
                .filter(b -> !b.isEmpty())
                // 将流转换成集合
                .collect(Collectors.toList());
    }
}
